package systeme;

import java.util.ArrayList;
import java.util.HashMap;

import rdp.RdP;

import java.util.ArrayList;

import rdp.RdP;
/**
 * Classe A NE PAS MODIFIER
 * @author chris
 */
public class GrapheRdP {	
	public RdP rdp;
	public int nbEtat;
	public int nbTransition;
	/**
	 * Pour chacune des ArrayList , la i ème position est pour le i ème état
	 */
	//Pour chaque etat, le marquage des différentes places
	public ArrayList<boolean[]> etat = new ArrayList<boolean[]>();
	//Pour chaque état la liste des etats dans lesquels on peut arriver apres franchissement d'une transition
	public ArrayList<ArrayList<Integer>> succ = new ArrayList<ArrayList<Integer>>(); 
	//Pour chaque état la liste des états a partir desquels on a pu franchir une transition pour arriver dans celui ci
	public ArrayList<ArrayList<Integer>> pred = new ArrayList<ArrayList<Integer>>();
	
	/**
	 * Une fois qu'on a succ, on peut générer pred.
	 * En effet si on a :
	 *  un etat X qui a pour successeur A, B ,C
	 * 	un etat Y qui a pour successeur A, C
	 * Alors A a pour predecesseur X, Y
	 * et B a pour predecesseur X seulement
	 * @ttention : il faut que succ existe deja avant de faire un appel a cette méthode
	 */
	public void genererPred(){
		//Initialiser pred
		//Pour chaque etat
		for(int i=0; i<succ.size(); i++){
			ArrayList<Integer> predecesseurDeCetEtat=new ArrayList<Integer>(); 
			pred.add(predecesseurDeCetEtat);
		}
		//Pour chaque etat
		for(int i=0; i<succ.size(); i++){
			//ArrayList<Integer> predecesseurDeCetEtat=new ArrayList<Integer>(); 
			ArrayList<Integer> mesSuccesseurs=succ.get(i);
			for(int indexSucc=0; indexSucc<mesSuccesseurs.size(); i++){
				//Pour chacun de mes successeurs, leur precedent est moi meme
				//Je recupere l'etat dont on parle et je lui dit qu'il a cet etat (i) comme pred
				pred.get(mesSuccesseurs.get(indexSucc)).add(i);
			}

		}
	}
	/**
	 * Chercher parmis les etats du graphe si il existe un état avec le marquage donné
	 * Utile pour voir si on est deja passé par un etat (en effet un etat est un marquage unique)
	 * @param marquage
	 * @return
	 */
	public boolean possedeEtatAvecMarquage(boolean [] marquage){
		boolean identique=true;
		for(int i=0; i<etat.size();i++){
			boolean [] tab=etat.get(i);
			for(int j=0; j<tab.length;j++){
				if(tab[i]!=marquage[i]){
					return false;
				}
			}
		}
		return identique;
	}
	public String toDot() {
		StringBuffer res = new StringBuffer();
		res.append("digraph system {\n");
		
		res.append("N" + 0 + " [label=\""+rdp.toStringMarquage(etat.get(0)) + "\",shape=octagon]\n");
				
		for (int e=1; e<etat.size(); e++) {
			res.append("N" + e + " [label=\""+rdp.toStringMarquage(etat.get(e)) + "\"]\n");
		}
		
		for (int e=0;e<etat.size(); e++)
			for (int t=0; t<succ.get(e).size(); t++)
			    res.append("N" + e + " -> N" + succ.get(e).get(t) + "\n"); 
		
		res.append("}\n");
		return res.toString();
	}
}